/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * VentanaVisualizacion.java
 *
 * Created on Apr 26, 2009, 7:01:07 PM
 */
package geomain;

import com.vividsolutions.jts.geom.Point;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.text.BadLocationException;
import modelo.grafico.PuntoGrafico;
import java.awt.Color;
import java.awt.Dimension;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.swing.text.Document;
import javax.swing.text.StyledDocument;
import modelo.ArcoDirigido;
import modelo.Nodo;
import modelo.PoliLinea;
import modelo.Punto;
import modelo.SegmentoLinea;
import modelo.grafico.PoliLineaGrafica;
import modelo.grafico.PuntoFallidoGrafico;
import modelo.grafico.SegmentoLineaGrafico;
import no.geosoft.cc.graphics.GInteraction;
import no.geosoft.cc.graphics.GObject;
import no.geosoft.cc.graphics.GScene;
import no.geosoft.cc.graphics.GSegment;
import no.geosoft.cc.graphics.GStyle;
import no.geosoft.cc.graphics.GText;
import no.geosoft.cc.graphics.GWindow;
import no.geosoft.cc.graphics.ZoomInteraction;

/**
 *
 * @author Fredy
 */
public class VentanaNodoArcoArea extends javax.swing.JInternalFrame {

    private Main ventanaPadre = null;
    GWindow ventanaDeDibujo = null;
    GScene scene = null;
    GSegment segmentoOrigen = null;
    private Collection grupoDePuntosSeleccionados;
    //private Collection grupoDeLineasSeleccionadas;
    private int mouseX0,  mouseY0;
    private GObject bandaDeSeleccion;

    //private GStyle textStyle_;
    private GStyle estiloPuntoSeleccionado;
    private GStyle estiloPuntoOrigen;
    //private GStyle estiloPuntoNormal;
    //private GStyle estiloPuntoCandidato;
    private GStyle estiloLineaSeleccionada;
    GSegment puntoInicialDeLinea = null;
    GSegment puntoFinalDeLinea = null;

    /** Creates new form VentanaVisualizacion */
    public VentanaNodoArcoArea() {
        initComponents();

    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        buttonGroupOpciones = new javax.swing.ButtonGroup();
        jToolBar1 = new javax.swing.JToolBar();
        jToggleButtonZoom = new javax.swing.JToggleButton();
        jPanel1 = new javax.swing.JPanel();
        jLabelG = new javax.swing.JLabel();
        jLabelP = new javax.swing.JLabel();
        jLabelS = new javax.swing.JLabel();
        jLabelO = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jPanelVisualizacion = new javax.swing.JPanel();
        jPanel2 = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane();
        jEditorPane1 = new javax.swing.JEditorPane();

        setClosable(true);
        setTitle("Nodo Arco Area");
        addInternalFrameListener(new javax.swing.event.InternalFrameListener() {
            public void internalFrameActivated(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameClosing(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameDeactivated(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameDeiconified(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameIconified(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameOpened(javax.swing.event.InternalFrameEvent evt) {
                formInternalFrameOpened(evt);
            }
        });

        jToolBar1.setRollover(true);

        buttonGroupOpciones.add(jToggleButtonZoom);
        jToggleButtonZoom.setText("Zoom");
        jToggleButtonZoom.setToolTipText("<html>\nBoton Izquierdo = ZOOM IN\n<BR>\nBoton Derecho = ZOOM OUT\n<BR>\nAmbos Botones = RESTAURAR\n</html>");
        jToggleButtonZoom.setFocusable(false);
        jToggleButtonZoom.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jToggleButtonZoom.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToggleButtonZoom.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jToggleButtonZoomActionPerformed(evt);
            }
        });
        jToolBar1.add(jToggleButtonZoom);

        getContentPane().add(jToolBar1, java.awt.BorderLayout.PAGE_START);

        jPanel1.setPreferredSize(new java.awt.Dimension(394, 60));
        jPanel1.setLayout(new java.awt.GridBagLayout());

        jLabelG.setText("G = ?");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 0);
        jPanel1.add(jLabelG, gridBagConstraints);

        jLabelP.setText("| P = ?");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 0);
        jPanel1.add(jLabelP, gridBagConstraints);

        jLabelS.setText("| S = ?");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 0);
        jPanel1.add(jLabelS, gridBagConstraints);

        jLabelO.setText("| O = ?");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 0);
        jPanel1.add(jLabelO, gridBagConstraints);

        getContentPane().add(jPanel1, java.awt.BorderLayout.PAGE_END);

        jPanelVisualizacion.setLayout(new java.awt.BorderLayout());
        jScrollPane1.setViewportView(jPanelVisualizacion);

        getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);

        jPanel2.setPreferredSize(new java.awt.Dimension(400, 100));
        jPanel2.setLayout(new java.awt.BorderLayout());

        jScrollPane2.setViewportView(jEditorPane1);

        jPanel2.add(jScrollPane2, java.awt.BorderLayout.CENTER);

        getContentPane().add(jPanel2, java.awt.BorderLayout.LINE_END);

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-1000)/2, (screenSize.height-600)/2, 1000, 600);
    }// </editor-fold>//GEN-END:initComponents

    private void formInternalFrameOpened(javax.swing.event.InternalFrameEvent evt) {//GEN-FIRST:event_formInternalFrameOpened
        // TODO add your handling code here:

        if (this.getVentanaPadre() == null) {
            // Una referencia a la ventana Principal de la aplicacion
            this.setVentanaPadre((geomain.Main) this.getParent().getParent().getParent().getParent().getParent());
        }






    }//GEN-LAST:event_formInternalFrameOpened

    private void jToggleButtonZoomActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButtonZoomActionPerformed
        // TODO add your handling code here:
        ventanaDeDibujo.startInteraction(new ZoomInteraction(scene));
}//GEN-LAST:event_jToggleButtonZoomActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.ButtonGroup buttonGroupOpciones;
    private javax.swing.JEditorPane jEditorPane1;
    private javax.swing.JLabel jLabelG;
    private javax.swing.JLabel jLabelO;
    private javax.swing.JLabel jLabelP;
    private javax.swing.JLabel jLabelS;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanelVisualizacion;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JToggleButton jToggleButtonZoom;
    private javax.swing.JToolBar jToolBar1;
    // End of variables declaration//GEN-END:variables

    /**
     * @return the ventanaPadre
     */
    public Main getVentanaPadre() {
        return ventanaPadre;
    }

    /**
     * @param ventanaPadre the ventanaPadre to set
     */
    public void setVentanaPadre(Main ventanaPadre) {
        this.ventanaPadre = ventanaPadre;
    }

    synchronized public void dibujarNAA() {

        double extensionDelMundoEnX = 1000;
        double extensionDelMundoEnY = 1000;
        int puntosEnX = ventanaPadre.getEvaluacionDominio().getDominioEvaluado().getGrillaDominio().getColumnas();
        int puntosEnY = ventanaPadre.getEvaluacionDominio().getDominioEvaluado().getGrillaDominio().getFilas();
        double espacioEntrePuntosX = extensionDelMundoEnX / puntosEnX;
        double espacioEntrePuntosY = extensionDelMundoEnY / puntosEnY;
        int c = 0;
        int i = 0;
        double acumuladoX = 0;
        double acumuladoY = 0;

        jLabelG.setText("G = " + puntosEnX + " x " + puntosEnY);

        jPanelVisualizacion.removeAll();
        ventanaDeDibujo = new GWindow(new Color(255, 255, 255));
        jPanelVisualizacion.add(ventanaDeDibujo.getCanvas());

        scene = new GScene(ventanaDeDibujo);
        scene.setWorldExtent(0.0, 0.0, extensionDelMundoEnX, extensionDelMundoEnY);


        for (c = 0; c < puntosEnX + 1; c++) {
            GObject object = new PuntoGrafico(acumuladoX, acumuladoY);
            for (i = 0; i < puntosEnY + 1; i++) {
                object = new PuntoGrafico(acumuladoX, acumuladoY);
                //scene.add(object);
                acumuladoY += espacioEntrePuntosY;
            }
            //scene.add(object);
            acumuladoX += espacioEntrePuntosX;
            acumuladoY = 0;

        }

        estiloPuntoSeleccionado = new GStyle();
        estiloPuntoSeleccionado.setForegroundColor(new Color(117, 146, 60));
        estiloPuntoSeleccionado.setBackgroundColor(new Color(117, 146, 60));
        estiloPuntoSeleccionado.setLineWidth(2);

        /*
        estiloPuntoOrigen = new GStyle();
        estiloPuntoOrigen.setForegroundColor(new Color(255, 102, 0));
        estiloPuntoOrigen.setBackgroundColor(new Color(255, 102, 0));
        estiloPuntoOrigen.setLineWidth(5);

        estiloPuntoNormal = new GStyle();
        estiloPuntoNormal.setForegroundColor(new Color(242, 221, 220));
        estiloPuntoNormal.setBackgroundColor(new Color(242, 221, 220));
        estiloPuntoNormal.setLineWidth(2);

        estiloPuntoCandidato = new GStyle();
        estiloPuntoCandidato.setForegroundColor(new Color(149, 179, 215));
        estiloPuntoCandidato.setBackgroundColor(new Color(149, 179, 215));
        estiloPuntoCandidato.setLineWidth(2);
         */

        bandaDeSeleccion = new GObject("Interaction");
        GStyle rubberBandStyle = new GStyle();
        rubberBandStyle.setBackgroundColor(new Color(1.0f, 0.0f, 0.0f, 0.2f));
        bandaDeSeleccion.setStyle(rubberBandStyle);
        scene.add(bandaDeSeleccion);

        jLabelP.setText(" | P = ?");
        jLabelS.setText(" | S = ?");
        jLabelO.setText(" | O = ?");

        /*El conjunto P no es necesario dibujarlo, ya que lo importante son los spaghettis
        Set<Punto> conjuntoP = ventanaPadre.getEvaluacionDominio().getDominioEvaluado().getConjuntoP();

        for (Iterator it = conjuntoP.iterator(); it.hasNext();) {
            Punto miPunto = (Punto) it.next();
            PuntoGrafico miPuntoGrafico = new PuntoGrafico(miPunto.getCoordenadaX(), miPunto.getCoordenadaY());
            miPuntoGrafico.setStyle(estiloPuntoSeleccionado);
            scene.add(miPuntoGrafico);
        }*/


        //Set<SegmentoLinea> conjuntoS = ventanaPadre.getEvaluacionDominio().getDominioEvaluado().getConjuntoS();
        List<ArcoDirigido> arcos = ventanaPadre.getEvaluacionDominio().getRepresentacionNAA().getArcos();

        Iterator<ArcoDirigido> recorrido = arcos.iterator();

        int k = 0;
        
        while (recorrido.hasNext()) {
            ArcoDirigido arcoActual = recorrido.next();

            Nodo nodoInicial = arcoActual.getInicial();
            Nodo nodoFinal = arcoActual.getFinal();

            int n = arcoActual.getPoliLinea().getNumPoints();

            Color miColor = new Color(
                    (int) (Math.random() * 255), (int) (Math.random() * 255), (int) (Math.random() * 255));

            estiloLineaSeleccionada = new GStyle();
            estiloLineaSeleccionada.setForegroundColor(miColor);
            //estiloLineaSeleccionada.setLineWidth(6/((k%2)+1));
            estiloLineaSeleccionada.setLineWidth(3);

            k++;
            //actual.imprimirPoliLinea("Dibujando Spaghetti " + k);
            agregarTexto(arcoActual.toString("Arco " + arcoActual.getEtiqueta()));
            agregarTexto("\nInicial [" + nodoInicial.getEtiqueta() + "] = (" + nodoInicial.getCoordenadaX() + "," + nodoInicial.getCoordenadaY() + ")");
            agregarTexto("\nFinal [" + nodoFinal.getEtiqueta() + "] = (" + nodoFinal.getCoordenadaX() + "," + nodoFinal.getCoordenadaY() + ")");
            agregarTexto("\n\n");


            //for(c=0; c<n-1; c++){
                //puntoA = arcoActual.getPoliLinea().getPointN(c);
                //puntoB = arcoActual.getPoliLinea().getPointN(c+1);
                PoliLineaGrafica miPoliLineaGrafica = new PoliLineaGrafica(
                        arcoActual.getPoliLinea()
                        );
                miPoliLineaGrafica.setStyle(estiloLineaSeleccionada);
                miPoliLineaGrafica.fijarTexto(arcoActual.getEtiqueta(), miColor);
                scene.add(miPoliLineaGrafica);

            //}

            
        }


        /*
        Set<Punto> puntosFallidos = ventanaPadre.getEvaluacionDominio().getPuntosFallidos();

        for (Iterator it = puntosFallidos.iterator(); it.hasNext();) {
            Punto miPunto = (Punto) it.next();
            PuntoFallidoGrafico miPuntoGrafico = new PuntoFallidoGrafico(miPunto.getCoordenadaX(), miPunto.getCoordenadaY());
            //miPuntoGrafico.setStyle(estiloPuntoSeleccionado);
            scene.add(miPuntoGrafico);
        }
         */

        Punto origen = ventanaPadre.getEvaluacionDominio().getDominioEvaluado().getGrillaDominio().getPuntoOrigen();
        PuntoGrafico miPuntoGrafico = new PuntoGrafico(origen.getCoordenadaX(), origen.getCoordenadaY());
        miPuntoGrafico.setStyle(estiloPuntoOrigen);
        scene.add(miPuntoGrafico);
        actualizarEtiquetas();
        //agregarTexto(ventanaPadre.getEvaluacionDominio().getTextoLog());
        //agregarTexto(Punto.textoConjuntoPuntos(ventanaPadre.getEvaluacionDominio().getDominioEvaluado().getConjuntoP(), "Conjunto P Validado"));
        //agregarTexto(SegmentoLinea.textoConjuntoSegmentos(ventanaPadre.getEvaluacionDominio().getDominioEvaluado().getConjuntoS(), "Conjunto S Validado"));
    //        Set<SegmentoLinea> conjuntoS = ventanaPadre.getMiDominioGeometrico().getConjuntoS();

    }

    public void agregarTexto(String pTexto) {
        Document doc = jEditorPane1.getDocument();
        try {
            doc.insertString(doc.getLength(), pTexto, null);
        } catch (BadLocationException ex) {
            Logger.getLogger(VentanaNodoArcoArea.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void actualizarEtiquetas() {
        jLabelG.setText("G = " + ventanaPadre.getEvaluacionDominio().getDominioEvaluado().getGrillaDominio().getColumnas() + " x " + ventanaPadre.getEvaluacionDominio().getDominioInicial().getGrillaDominio().getFilas());
        jLabelO.setText("| O = " + ventanaPadre.getEvaluacionDominio().getDominioEvaluado().getGrillaDominio().getPuntoOrigen().getCoordenadaX() + " , " + ventanaPadre.getEvaluacionDominio().getDominioInicial().getGrillaDominio().getPuntoOrigen().getCoordenadaY());
        jLabelP.setText(" | P = " + ventanaPadre.getEvaluacionDominio().getDominioEvaluado().getConjuntoP().size() + " puntos");
        jLabelS.setText("| S = " + ventanaPadre.getEvaluacionDominio().getDominioEvaluado().getConjuntoS().size() + " lineas");
    }
}
